package com.lagou.edu.annotation;

import java.lang.annotation.*;

/**
 * @ProjectName: lagou-transfer
 * @Title: Autowired
 * @Package: com.lagou.edu.annotation
 * @Description: 自定义Autowired注解
 * @author: Ian
 * @date: 2020/12/4 10:32
 * @version: V1.0.0
 * @Copyright: 2020 kaiwu.lagou.com Inc. All rights reserved.
 *
 * <remark>
 * Target：注解限定了该注解的使用场景。
 * - ElementType.CONSTRUCTOR 可以给构造方法进行注解
 * - ElementType.METHOD 可以给方法进行注解
 * - ElementType.PARAMETER 可以给一个方法内的参数进行注解
 * - ElementType.TYPE 可以给一个类型进行注解，比如类、接口、枚举
 * - ElementType.FIELD 可以给属性进行注解
 * - ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
 * Retention 表明该注解的生命周期
 * - RetentionPolicy.SOURCE 源文件保留，编译时被丢弃，不包含在类文件中
 * - RetentionPolicy.CLASS JVM加载时被丢弃，包含在类文件中，默认值
 * - RetentionPolicy.RUNTIME 由JVM 加载，包含在类文件中，在运行时可以被获取到
 * Document
 * 表明该注解标记的元素可以被Javadoc 或类似的工具文档化
 * Inherited
 * 表明使用了@Inherited注解的注解，所标记的类的子类也会拥有这个注解
 * </remark>
 */
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    /**
     * 声明是否需要带注释的依赖项
     *
     * @return
     */
    boolean required() default true;
}
